﻿using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using Sumen.Library.Classes.Common;
using Sumen.Business.Data;
using Sumen.Model.Model;

namespace Sumen.Business.Presenter.Inventory
{
    public class OutwardPresenter
    {

        public string GetNewId(object pDate, string pStockID)
        {
            using (sumenEntities objEntities = new sumenEntities())
            {
                stock oStock = objEntities.stocks.FirstOrDefault(p => p.stock_id == pStockID);
                if (oStock == null) return "";
                string prefixCode = oStock.stock_CodeOutward;
                DateTime pDateTime = (DateTime)pDate;
                string prefix = prefixCode + "-" + pDateTime.ToString("ddMMyy") + "-";
                DateTime date = new DateTime(pDateTime.Year, pDateTime.Month, pDateTime.Day);
                int countMax = (from p in objEntities.stock_outward where p.Outw_RefDate == date select p).Count();
                var query = countMax == null ? 0 : countMax + 1;
                string count = query.ToString().PadLeft(4, '0');
                return prefix + count;
            }
        }

        //public int Add(List<inventory_details> pObjectValue, stock_outward pOutward)
        //{
        //    using (sumenEntities objEntities = new sumenEntities())
        //    {
        //        DbContextTransaction trans = objEntities.Database.BeginTransaction();
        //        try
        //        {
        //            //add outward
        //            //decimal disc = (decimal)(1f - (float)pOutward.Outw_DiscountRate / 100f);
        //            //pOutward.Outw_Amount *= disc;
        //            objEntities.stock_outward.Add(pOutward);
        //            objEntities.SaveChanges();

        //            bool isOver = true;
        //            for (int i = 0; i < pObjectValue.Count; i++)
        //            {
        //                //Trừ số lượng cho kệ
        //                int? posXId = pObjectValue[i].Invd_POSITION_X_ID;
        //                if (posXId != null && posXId != 0)
        //                {
        //                    position_x_inventory tempX = objEntities.position_x_inventory.FirstOrDefault(p => p.Posx_ID == posXId);
        //                    tempX.Posx_Quantity = tempX.Posx_Quantity - pObjectValue[i].Invd_Quantity;
        //                    objEntities.SaveChanges();
        //                }


        //                //lay ma kho, vì dùng chung với add order(không xác định rõ kho)
        //                if (pOutward.Outw_Stock_id != null)
        //                {
        //                    pObjectValue[i].Invd_Stock_ID = pOutward.Outw_Stock_id;
        //                }
        //                //gán thông tin liên quan
        //                pObjectValue[i].Invd_Description = pOutward.Outw_Description;
        //                pObjectValue[i].Invd_Provider_ID = pOutward.Outw_Customer_ID;

        //                //Lấy sản phẩm trong kho để trừ số lượng đã xuất và tổng số tiền
        //                string temProductDetailId = pObjectValue[i].Invd_PRODUCT_DETAILS_ID;
        //                int? tempPositionX = pObjectValue[i].Invd_POSITION_X_ID;
        //                string tempStockID = pObjectValue[i].Invd_Stock_ID;
        //                var tempInventory =
        //                  (from p in objEntities.inventories
        //                   where p.Inv_PRODUCT_DETAILS_ID == temProductDetailId && p.Inv_Stock_ID == tempStockID && p.Invd_POSITION_X_ID == tempPositionX
        //                   select p).FirstOrDefault();

        //                //set số lượng còn còn lại và tổng tiền vốn còn lại vào inventory details
        //                if (tempInventory.Inv_Quantity == 0)
        //                {
        //                    isOver = false;
        //                    break;
        //                }
        //                pObjectValue[i].Invd_E_Quantity = tempInventory.Inv_Quantity - pObjectValue[i].Invd_Quantity;
        //                pObjectValue[i].Invd_UnitPrice = tempInventory.Inv_Amount / tempInventory.Inv_Quantity;
        //                pObjectValue[i].Invd_E_Amount = pObjectValue[i].Invd_UnitPrice * pObjectValue[i].Invd_E_Quantity;
        //                pObjectValue[i].Invd_Amount = pObjectValue[i].Invd_UnitPrice * pObjectValue[i].Invd_Quantity;

        //                tempInventory.Inv_Quantity -= pObjectValue[i].Invd_Quantity;
        //                if (tempInventory.Inv_Quantity < 0)
        //                {
        //                    isOver = false;
        //                    break;
        //                }
        //                tempInventory.Inv_Amount = (tempInventory.Inv_Amount - pObjectValue[i].Invd_Amount) < 0 ? 0 : (tempInventory.Inv_Amount - pObjectValue[i].Invd_Amount);
        //                pObjectValue[i].Invd_INENTORY_ID = tempInventory.Inv_ID;

        //                objEntities.SaveChanges();

        //                //add inventory details
        //                pObjectValue[i].Invd_RefNo = pOutward.Outw_ID;
        //                pObjectValue[i].Invd_RefDate = pOutward.Outw_RefDate;
        //                pObjectValue[i].Invd_RefType = pOutward.Outw_RefType;
        //                var maxSorted = objEntities.inventory_details.Max(p => p.Invd_Sorted);
        //                pObjectValue[i].Invd_Sorted = maxSorted == null ? 0 : maxSorted + 1;


        //                pObjectValue[i].Invd_ID = 0;
        //                objEntities.inventory_details.Add(pObjectValue[i]);
        //                objEntities.SaveChanges();
        //                //add inward detail
        //                stock_outward_details outwardDetails = new stock_outward_details()
        //                {
        //                    Outws_STOCK_OUTWARD_ID = pOutward.Outw_ID,
        //                    Outws_RefType = pOutward.Outw_RefType,
        //                    Outws_Stock_ID = pOutward.Outw_Stock_id,
        //                    Outws_PRODUCT_Details_ID = pObjectValue[i].Invd_PRODUCT_DETAILS_ID,
        //                    Outws_ProductName = pObjectValue[i].Invd_Product_Name,
        //                    Outws_Quantity = pObjectValue[i].Invd_Quantity,
        //                    Outws_Amount = pObjectValue[i].Invd_Amount,
        //                    Outws_UnitPrice = pObjectValue[i].Invd_Price,
        //                    Outws_Description = pObjectValue[i].Invd_Description,
        //                    Outws_POSITION_X_ID = pObjectValue[i].Invd_POSITION_X_ID,
        //                    Outws_Discount = pObjectValue[i].Invd_Discount
        //                };
        //                objEntities.stock_outward_details.Add(outwardDetails);
        //                objEntities.SaveChanges();


        //            }
        //            if (isOver)
        //            {
        //                trans.Commit();
        //                return 1;
        //            }
        //            else
        //            {
        //                trans.Rollback();
        //                ClsMsgBox.Loi("Số lượng trong kho không đủ.");
        //                return 0;
        //            }
        //        }
        //        catch (Exception ex)
        //        {
        //            trans.Rollback();
        //            ClsMsgBox.LoiChung(ex, false);
        //            return 0;
        //        }
        //    }
        //}


        public int Add(List<inventory_details> pObjectValue, stock_outward pOutward)
        {
            Dao dao = new Dao(true, true);
            dao.Add(pOutward);
            bool isOver = true;
            for (int i = 0; i < pObjectValue.Count; i++)
            {
                //Trừ số lượng cho kệ
                int? posXId = pObjectValue[i].Invd_POSITION_X_ID;
                if (posXId != null && posXId != 0)
                {
                    position_x_inventory tempX = dao.GetById<position_x_inventory>(posXId);//objEntities.position_x_inventory.FirstOrDefault(p => p.Posx_ID == posXId);
                    tempX.Posx_Quantity = tempX.Posx_Quantity - pObjectValue[i].Invd_Quantity;
                    dao.Update(tempX);
                    //objEntities.SaveChanges();
                }
                //lay ma kho, vì dùng chung với add order(không xác định rõ kho)
                if (pOutward.Outw_Stock_id != null)
                {
                    pObjectValue[i].Invd_Stock_ID = pOutward.Outw_Stock_id;
                }
                //gán thông tin liên quan
                pObjectValue[i].Invd_Description = pOutward.Outw_Description;
                pObjectValue[i].Invd_Provider_ID = pOutward.Outw_Customer_ID;

                //Lấy sản phẩm trong kho để trừ số lượng đã xuất và tổng số tiền
                string temProductDetailId = pObjectValue[i].Invd_PRODUCT_DETAILS_ID;
                int? tempPositionX = pObjectValue[i].Invd_POSITION_X_ID;
                string tempStockID = pObjectValue[i].Invd_Stock_ID;
                var listTempInventory = dao.FindByMultiColumnAnd<inventory>(new[] { "Inv_PRODUCT_DETAILS_ID", "Inv_Stock_ID", "Invd_POSITION_X_ID" },
                    temProductDetailId, tempStockID, tempPositionX);
                //(from p in objEntities.inventories
                // where p.Inv_PRODUCT_DETAILS_ID == temProductDetailId && p.Inv_Stock_ID == tempStockID && p.Invd_POSITION_X_ID == tempPositionX
                // select p).FirstOrDefault();
                inventory tempInventory;
                if (listTempInventory.Count == 0)
                {
                    tempInventory = null;
                }
                else
                {
                    tempInventory = listTempInventory.First();
                }
                //set số lượng còn còn lại và tổng tiền vốn còn lại vào inventory details
                if (tempInventory.Inv_Quantity == 0)
                {
                    isOver = false;
                    break;
                }
                pObjectValue[i].Invd_E_Quantity = tempInventory.Inv_Quantity - pObjectValue[i].Invd_Quantity;
                pObjectValue[i].Invd_UnitPrice = tempInventory.Inv_Amount / tempInventory.Inv_Quantity;
                pObjectValue[i].Invd_E_Amount = pObjectValue[i].Invd_UnitPrice * pObjectValue[i].Invd_E_Quantity;
                pObjectValue[i].Invd_Amount = pObjectValue[i].Invd_Price * pObjectValue[i].Invd_Quantity;

                tempInventory.Inv_Quantity -= pObjectValue[i].Invd_Quantity;
                if (tempInventory.Inv_Quantity < 0)
                {
                    isOver = false;
                    break;
                }
                tempInventory.Inv_Amount = (tempInventory.Inv_Amount - pObjectValue[i].Invd_Amount) < 0 ? 0 : (tempInventory.Inv_Amount - pObjectValue[i].Invd_Amount);
                pObjectValue[i].Invd_INENTORY_ID = tempInventory.Inv_ID;
                dao.Update(tempInventory);

                //add inventory details
                pObjectValue[i].Invd_RefNo = pOutward.Outw_ID;
                pObjectValue[i].Invd_RefDate = pOutward.Outw_RefDate;
                pObjectValue[i].Invd_RefType = pOutward.Outw_RefType;
                var maxSorted = dao.GetContext<inventory_details>().Set<inventory_details>().Max(p => p.Invd_Sorted);//objEntities.inventory_details.Max(p => p.Invd_Sorted);
                pObjectValue[i].Invd_Sorted = maxSorted == null ? 0 : maxSorted + 1;


                pObjectValue[i].Invd_ID = 0;
                dao.Add(pObjectValue[i]);
                //add inward detail
                stock_outward_details outwardDetails = new stock_outward_details()
                {
                    Outws_STOCK_OUTWARD_ID = pOutward.Outw_ID,
                    Outws_RefType = pOutward.Outw_RefType,
                    Outws_Stock_ID = pOutward.Outw_Stock_id,
                    Outws_PRODUCT_Details_ID = pObjectValue[i].Invd_PRODUCT_DETAILS_ID,
                    Outws_ProductName = pObjectValue[i].Invd_Product_Name,
                    Outws_Quantity = pObjectValue[i].Invd_Quantity,
                    Outws_Amount = pObjectValue[i].Invd_Amount,
                    Outws_UnitPrice = pObjectValue[i].Invd_Price,
                    Outws_Description = pObjectValue[i].Invd_Description,
                    Outws_POSITION_X_ID = pObjectValue[i].Invd_POSITION_X_ID,
                    Outws_Discount = pObjectValue[i].Invd_Discount
                };
                dao.Add(outwardDetails);
            }
            if (isOver)
            {
                return 1;
            }
            else
            {
                ClsMsgBox.Loi("Số lượng trong kho không đủ.");
                return 0;
            }
        }


    }
}
